/*
 * ABO.h
 *
 *  Created on: 01/06/2011
 *      Author: anibal
 */

#ifndef ABO_H_
#define ABO_H_

#include "AB.h"
#include <stdlib.h>

#define OK 0

#define RES_DELETED 1
#define RES_OK 0
#define RES_ELEMENTO_YA_EXISTE -1
#define RES_OUT_OF_MEMORY -2
#define RES_ELEMENTO_NO_EXISTE -3

#define I_MAY_D -1
#define D_MAY_I 1
#define IGUALES 0
#define ELEM_EXISTENTE 2

typedef int (*taboCmp) (void* I, void* D);

typedef int (*taboProc) (void*);

typedef enum { pre_ord, in_ord, pos_ord } metodo;

typedef struct _TABO {
	int tamanio;
	TAB arbol;
}TABO;




/**
 * Creará una instancia Arbol Ordenado.
 *
 * PRE-CONDICION:
 * POST:
 *
 * @param: arbol a ser creado, type: TABO.
 * @param: tamaño del dato que contendrá el arbol, type: int;
 * @return: OK.
 **/
int ABO_Crear( TABO* abo, int tamDato );


/**
 *
 * @return: OK.
 **/
int ABO_Vaciar( TABO *abo );


/**
 *
 * @return: TRUE, si está vacio.
 *          FALSE, en caso contrario.
 **/
int ABO_Vacio(const TABO* abo );


/**
 *
 * @return: OK.
 **/
int ABO_ElemCte(TABO abo, void* elem );


/**
 *
 * @return: OK.
 **/
int ABO_ModifCte( TABO* abo, void* elem );


/**
 *
 * @return: TRUE, si se pudo mover.
 *          FALSE, en caso contrario.
 **/
int ABO_MoverCte( TABO* abo, int mov );


/**
 * @return: RES_OK, si pudo borrar.
 *          RES_ARBOL_VACIO, en caso contrario.
 **/
int ABO_BorrarRama( TABO *abo );


/**
 * @return: RES_OK, si pudo borrar.
 *          RES_MOV_INVALIDO, en caso contrario.
 **/
int ABO_BorrarSubRama( TABO* abo, int mov );


/*
 * Inserta un elemento inexistente, en el arbol binario de manera ordenada.
 * PRE-CONDICION: arbol debe existir.
 * POST: elemento insertado de forma ordenada (mientras elem no exista en el arbol)
 *
 * @param: manipulador del arbol ordenado, type: TABO*.
 * @param: función para comparar los elementos internos, type: taboCmp.
 * @param: elemento a insertar, type: void* const elem.
 * @return: TRUE, si lo pudo insertar.
 *          ELEM_EXISTENTE, si el elemento ya existía.
 **/
int ABO_InsertarOrdenado( TABO* abo, taboCmp cmp, void* const elem );


//inserta nodos en forma ordenada
//int ABO_Insertar_Ordenado(TABO* a,TListaSimple *subdominios, void* data);



#endif /* ABO_H_ */
